﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Text.RegularExpressions;

namespace InnvoiceActual.Logica.GestorObject
{
    public class ClienteCS : INotifyPropertyChanged, IDataErrorInfo
    {
        #region declaracion de Variables

        public int CodigoEmpresa { get; set; }
        public int    Codigo { get; set; }
        public string razonSocial;
        public string responsable;
        public string telefono;
        public string correo;
        public string web;
        public string contacto;
        public string categoria;
        public string direccion;
        public int nroLocalidad;
        public string Localidad { get; set; }
        public int nroProvincia;
        public string Provincia { get; set; }
        public int nroPais;
        public string Pais { get; set; }
        public string codigoPostal;
        public int tipodni;
        public string nroDni;
        public int    nroTipoContrib;
        public string TipoContrib { get; set; } //es la descripcion del tipo de contribucion 
        public string nrocontrib;
        public int    nroCondicionDePago;
        public string condicionDePago { get; set; }
        public string listaDePrecio;
        public byte activo;
        public string lugarDeEntrega;
        public string diaHoraDePago;
        public string Proveedor { get; set; }
        public bool   ExistenDatos { get; set; }
        public DateTime fechaAltaSistema;

        public event PropertyChangedEventHandler PropertyChanged;

        #endregion declaracion de Variables

        #region constructor

        public ClienteCS() {
            razonSocial = "Tu Razon Social";
            telefono  = "4999999";
            correo  = "TuCorreoElectronico@gmail.com";
            web  = "www.TuPaginaWeb.com";
            contacto = "Tu Contacto";
            categoria  = "Tu categoria";
            direccion  = "Tu Dirección";
            Localidad = "Tu Localidad";
            listaDePrecio  = "Tu Lista de Precio";
            lugarDeEntrega = "Lugar de entrega de la mercaderia";
            diaHoraDePago = "Dia y hora de pago";
            Proveedor = "Nombre del Proveedor";
            nrocontrib = "27-99999999-0";
            codigoPostal = "3000";
            nroDni = "25.456.678";
            responsable = "Tu Responsable Legal";
            ExistenDatos = true;
            fechaAltaSistema = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Local);
        }

        #endregion constructor
         
        public string Error
        {
            get
            {
                return null;
            }
        }
        public string this[string propertyName]
        {
            get
            {
                return IsValid(propertyName);
            }
        }

        #region metodos de acceso a variables

        public string RazonSocial
        {
            get
            {
                return razonSocial;
            }
            set
            {
                razonSocial = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("RazonSocial"));
            }
        }
        public string Responsable
        {
            get
            {
                return responsable;
            }
            set
            {
                responsable = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Responsable"));
            }
        }
        public string Telefono
        {
            get
            {
                return telefono;
            }
            set
            {
                telefono = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Telefono"));
            }
        }
        public string Correo
        {
            get
            {
                return correo;
            }
            set
            {
                correo = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Correo"));
            }
        }
        public string Web
        {
            get
            {
                return web;
            }
            set
            {
                web = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Web"));
            }
        }
        public string Contacto
        {
            get
            {
                return contacto;
            }
            set
            {
                contacto = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Contacto"));
            }
        }
        public string Categoria
        {
            get
            {
                return categoria;
            }
            set
            {
                categoria = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Categoria"));
            }
        }
        public string Direccion
        {
            get
            {
                return direccion;
            }
            set
            {
                direccion = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Direccion"));
            }
        }
        public string NroDni
        {
            get
            {
                return nroDni;
            }
            set
            {
                nroDni = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("NroDni"));
            }
        }
        public string Nrocontrib
        {
            get
            {
                return nrocontrib;
            }
            set
            {
                nrocontrib = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Nrocontrib"));
            }
        }
        public string CodigoPostal
        {
            get
            {
                return codigoPostal;
            }
            set
            {
                codigoPostal = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("CodigoPostal"));
            }
        }
        public string LugarDeEntrega
        {
            get
            {
                return lugarDeEntrega;
            }
            set
            {
                lugarDeEntrega = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("LugarDeEntrega"));
            }
        }
        public string DiaHoraDePago
        {
            get
            {
                return diaHoraDePago;
            }
            set
            {
                diaHoraDePago = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("DiaHoraDePago"));
            }
        }
        public int NroPais
        {
            get
            {
                return nroPais;
            }
            set
            {
                nroPais = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("NroPais"));
            }
        }
        public int NroProvincia
        {
            get
            {
                return nroProvincia;
            }
            set
            {
                nroProvincia = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("NroProvincia"));
            }
        }
        public int NroLocalidad
        {
            get
            {
                return nroLocalidad;
            }
            set
            {
                nroLocalidad = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("NroLocalidad"));
            }
        }
        public int TipoDni
        {
            get
            {
                return tipodni;
            }
            set
            {
                tipodni = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("TipoDni"));
            }
        }
        public string ListaDePrecio
        {
            get
            {
                return listaDePrecio;
            }
            set
            {
                listaDePrecio = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("ListaDePrecio"));
            }
        }
        public int NroTipoContrib
        {
            get
            {
                return nroTipoContrib;
            }
            set
            {
                nroTipoContrib = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("NroTipoContrib"));
            }
        }
        public int NroCondicionDePago
        {
            get
            {
                return nroCondicionDePago;
            }
            set
            {
                nroCondicionDePago = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("NroCondicionDePago"));
            }
        }
        public byte Activo
        {
            get
            {
                return activo;
            }
            set
            {
                activo = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Activo"));
            }
        }
        public DateTime FechaAltaSistema
        {
            get
            {
                return fechaAltaSistema;
            }
            set
            {
                fechaAltaSistema = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("FechaAltaSistema"));
            }
        }

        #endregion metodos de acceso a variables

        #region metodos de validacion

        private string IsValid(string propertyName)
        {
            switch (propertyName)
            {
                case "RazonSocial":
                    if (string.IsNullOrWhiteSpace(RazonSocial))
                        return "El campo Razon Social es requerido";
                    else if (10 > RazonSocial.Length)
                        return "El campo Razon Social debe " +
                            "contener más de 10 caracteres";
                    break;
                case "Responsable":
                    if (string.IsNullOrWhiteSpace(Responsable))
                        return "El campo Razon Social es requerido";
                    else if (10 > Responsable.Length)
                        return "El campo Responsable Legal debe " +
                               "contener más de 10 caracteres";
                    break;
                case "Telefono":
                    if (string.IsNullOrWhiteSpace(Telefono))
                        return "El campo Telefono es requerido";
                    break;
                case "Correo":
                    if (string.IsNullOrWhiteSpace(Correo))
                        return "El campo Correo Electrónico es requerido \n ej: notengo@gmail.com";
                    else if (5 > Correo.Length)
                        return "El campo Correo Electrónico debe "
                            + "contener más de 15 caracteres";
                    else
                    {
                        Regex regEx;
                        regEx = new Regex(@"^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*\." +
                            @"(\w{2}|(com|net|org|edu|int|mil|gov|arpa|" +
                            @"biz|aero|name|coop|info|pro|museum))$");
                        if (!regEx.IsMatch(Correo))
                            return "El campo Correo Electrónico no " +
                                   "tiene un formato correcto \n ej: notengo@gmail.com";
                    }
                    break;
                case "Web":
                    if (string.IsNullOrWhiteSpace(Web))
                        return "El campo Pagina Web es requerido \n ej: www.notengo.com";
                    else
                    {
                        Regex regEx;
                        regEx = new Regex(@"^(www|http:\/\/)(.*\.(com$|com.ar$|net$|org$))");
                        if (!regEx.IsMatch(Web))
                            return "El campo Pagina Web no " +
                                   "tiene un formato correcto \n ej: www.notengo.com";
                    }
                    break;
                case "Contacto":
                    if (string.IsNullOrWhiteSpace(Contacto))
                        return "El campo Nombre es requerido";
                    else if (10 > Contacto.Length)
                        return "El campo Responsable Legal no debe " +
                            "contener más de 10 caracteres";
                    break;
                case "Direccion":
                    if (string.IsNullOrWhiteSpace(Direccion))
                        return "El campo Dirección es requerido";
                    else if (10 > Direccion.Length)
                        return "El campo Dirección debe " +
                            "contener más de 10 caracteres";
                    break;
                case "NroDni":
                    if (string.IsNullOrWhiteSpace(NroDni))
                        return "El campo Número de Documento es requerido \n ej: 23.489.345 o 23489345";
                    else
                    {
                        Regex regEx;
                        regEx = new Regex(@"^[0-9]{1,3}\.[0-9]{3}\.[0-9]{3}|^[0-9]{8,9}$");
                        if (!regEx.IsMatch(NroDni))
                            return "El campo Número de Documento no " +
                                   "tiene un formato correcto \n ej: 23.489.345 o 23489345";
                    }
                    break;
                case "Nrocontrib":
                    if (string.IsNullOrWhiteSpace(Nrocontrib))
                        return "El campo Número de Contribución es requerido \n ej: 27-23480444-0";
                    else
                    {
                        Regex regEx;
                        regEx = new Regex(@"^[0-9]{2}\-[0-9]{7,9}\-[0-9]{1}$");
                        if (!regEx.IsMatch(Nrocontrib))
                            return "El campo Número de Contribución no \n" +
                                   "tiene un formato correcto \n ej:  27-23480444-0";
                    }
                    break;
                case "CodigoPostal":
                    if (string.IsNullOrWhiteSpace(CodigoPostal))
                        return "El campo Codigo Postal es requerido - ej: 3000";
                    else
                    {
                        Regex regEx;
                        regEx = new Regex(@"^[0-9]{4}$");
                        if (!regEx.IsMatch(CodigoPostal))
                            return "El campo Codigo Postal no " +
                                   "tiene un formato correcto \n ej:3000";
                    }
                    break;
            }
            return null;
        }


        public bool IsValid()
        {
            return string.IsNullOrEmpty(IsValid("RazonSocial"))
                && string.IsNullOrEmpty(IsValid("Responsable"))
                && string.IsNullOrEmpty(IsValid("Telefono"))
                && string.IsNullOrEmpty(IsValid("Correo"))
                && string.IsNullOrEmpty(IsValid("Web"))
                && string.IsNullOrEmpty(IsValid("Contacto"))
                && string.IsNullOrEmpty(IsValid("Direccion"))
                && string.IsNullOrEmpty(IsValid("NroDni"))
                && string.IsNullOrEmpty(IsValid("Nrocontrib"))
                && string.IsNullOrEmpty(IsValid("CodigoPostal"));
        }

        #endregion metodos de validacion

    }
}
